package com.shopoo.authorization.infrastructure.repository;

import java.util.List;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shopoo.authorization.domain.entity.OauthRoleExt;
import com.shopoo.authorization.domain.entity.OauthUser;
import com.shopoo.authorization.domain.repository.IUserRepository;
import com.shopoo.authorization.domain.valueobject.UserDetailsExt;
import com.shopoo.authorization.infrastructure.mapper.RoleMapper;
import com.shopoo.authorization.infrastructure.mapper.UserMapper;
import com.shopoo.exception.BizException;
import jakarta.annotation.Resource;

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Repository;

/**
 * @Description 用户仓库
 * @Date 2020/5/24 1:54 下午
 * @Author <a href="mailto:android_li@sina.cn">Joe</a>
 **/
@Repository
public class UserRepositoryImpl extends ServiceImpl<UserMapper, OauthUser> implements UserDetailsService, IUserRepository {

    @Resource
    private UserMapper userMapper;

    @Resource
    private RoleMapper roleMapper;
//
//    @Override
//    public void add(User user) {
//        try {
//            user.generateId();
//            user.cryptPassword();
//            OauthUser oauthUser = InfrastructureConverter.INSTANCE.toOauthUser(user);
//            super.save(oauthUser);
//        } catch (DuplicateKeyException e) {
//            throw new BizException("用户名或电话号码已被使用，请检查");
//        }
//    }
//
//    @Override
//    public void removeByUserId(String userId) {
//        super.removeById(userId);
//    }
//
//    @Override
//    public UserAuth getByUsername(String username) {
//        return userMapper.findByUsername(username);
//    }
//
//    @Override
//    public PageResponse<User> getPageByConditions(UserQuery user) {
//        Page<OauthUser> page = PageHelper.startPage(user.getPageNum(), user.getPageSize());
//        LambdaQueryWrapper<OauthUser> queryWrapper = new LambdaQueryWrapper<>();
//        if (StringUtils.isNotBlank(user.getUserId())) {
//            queryWrapper.eq(OauthUser::getUserId, user.getUserId());
//        }
//        if (StringUtils.isNotBlank(user.getUsername())) {
//            queryWrapper.eq(OauthUser::getUsername, user.getUsername());
//        }
//        if (StringUtils.isNotBlank(user.getPhone())) {
//            queryWrapper.eq(OauthUser::getPhone, user.getPhone());
//        }
//        List<OauthUser> list = super.list(queryWrapper);
//        List<User> users = list.stream().map(oauthUser -> {
//            return InfrastructureConverter.INSTANCE.toUser(oauthUser);
//        }).collect(Collectors.toList());
//        return PageResponse.of(users, page.getTotal(), page.getPageSize(), page.getPageNum());
//    }
//
//    @Override
//    public List<User> getByConditions(UserQuery user) {
//        LambdaQueryWrapper<OauthUser> queryWrapper = new LambdaQueryWrapper<>();
//        if (StringUtils.isNotBlank(user.getUserId())) {
//            queryWrapper.eq(OauthUser::getUserId, user.getUserId());
//        }
//        if (StringUtils.isNotBlank(user.getUsername())) {
//            queryWrapper.eq(OauthUser::getUsername, user.getUsername());
//        }
//        if (StringUtils.isNotBlank(user.getPhone())) {
//            queryWrapper.eq(OauthUser::getPhone, user.getPhone());
//        }
//        List<OauthUser> list = super.list(queryWrapper);
//        return list.stream().map(oauthUser -> {
//            return InfrastructureConverter.INSTANCE.toUser(oauthUser);
//        }).collect(Collectors.toList());
//    }
//
//    @Override
//    public List<User> getUsers(UserQuery user) {
//        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//        if (StringUtils.isNotBlank(user.getUserId())) {
//            queryWrapper.eq(User::getUserId, user.getUserId());
//        }
//        if (StringUtils.isNotBlank(user.getUsername())) {
//            queryWrapper.likeRight(User::getUsername, user.getUsername());
//        }
//        if (StringUtils.isNotBlank(user.getNickname())) {
//            queryWrapper.likeRight(User::getNickname, user.getNickname());
//        }
//        if (StringUtils.isNotBlank(user.getPhone())) {
//            queryWrapper.likeRight(User::getPhone, user.getPhone());
//        }
//        if (user.getStatus() != null) {
//            queryWrapper.eq(User::getStatus, user.getStatus());
//        }
//        queryWrapper.orderByDesc(User::getCreateTime);
//        if (StringUtils.isNotBlank(user.getRoleName())) {
//            QueryWrapper queryWrapper1 = new QueryWrapper();
//            queryWrapper1.likeRight("roleName", user.getRoleName());
//            return userMapper.findByUserInfo(queryWrapper1);
//        }
//        return userMapper.findUsers(queryWrapper);
//    }
//
//    @Override
//    public User getByUserId(String userId) {
//        OauthUser oauthUser = super.getById(userId);
//        return InfrastructureConverter.INSTANCE.toUser(oauthUser);
//    }
//
//    @Override
//    public List<User> getByRoleId(Long roleId) {
//        return null;
//    }
//
//    @Override
//    public void updateById(User user) {
//        user.cryptPassword();
//        OauthUser oauthUser = InfrastructureConverter.INSTANCE.toOauthUser(user);
//        try {
//            boolean flag = super.updateById(oauthUser);
//            if (!flag) {
//                throw new IllegalArgumentException("找不到用户【"+ user.getUserId()+"】信息！");
//            }
//        } catch (DuplicateKeyException e) {
//            throw new BizException("用户名或电话号码已被使用，请检查");
//        }
//    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetailsExt user = userMapper.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("user [" + username + "] do not exist!");
        }
        if (user.getStatus() != 1) {
            throw new BizException("用户已被禁用，请联系平台管理员");
        }
        List<OauthRoleExt> roles = roleMapper.findByUserId(user.getUserId());
        user.setAuthorities(roles);
        return user;
    }
}
